﻿//===========================[ 8 / 7 / 2011 LVI ]=============================
//				Copyright c Vitaly Lyaschenko <SkyChameleon@gmail.com>
//								Source file
// Purpose: 
//=============================================================================
//#include "gl3com.h"
#include <GL/glew.h>
#include <GL/wglew.h>

#include "cwLogger.h"
#include "cFileManager.h"
#include "cShader.h"



cShader::cShader() :
    m_Shader(0),
    m_type(0)
{   }

cShader::~cShader()
{
    release();
}
///////////////////////////////////////////////////////////////////////////
// проверка статуса компиляции шейдеров
GLint cShader::checkStatus()
{
    GLint  statusCompile, length;
    char buffer[1024];
    glGetShaderiv ( m_Shader, GL_COMPILE_STATUS, &statusCompile );

    if ( statusCompile != GL_TRUE )
    {
        glGetShaderInfoLog( m_Shader,ARRAYSIZE(buffer),&length, buffer );
        cwLogger::writeERROR(" Shader " + std::string(buffer) );
    }

    return statusCompile;
}
///////////////////////////////////////////////////////////////////////////
// загружает/создает/компилирует шейдер указанного типа
bool cShader::load( const std::string fileName, GLenum type )
{
    std::string strBuff;

    strBuff = cFileManager::getFileAsString( fileName );
    // создание шейдера указанного типа
    create( type );
    // передача его для компиляции
    source( (const char*)strBuff.c_str(),strBuff.size() );
    strBuff.clear();

    // компиляция и возвращение статуса компиляции
    return compile();
}
///////////////////////////////////////////////////////////////////////////
// создает шейдер соответствующего типа
void cShader::create( GLenum type )
{
    ASSERT( m_Shader == 0 );
    m_type = type;
    m_Shader = glCreateShader( m_type );
}
///////////////////////////////////////////////////////////////////////////
// удаляет шейдер
void cShader::release()
{
    if( glIsShader(m_Shader) == GL_TRUE )
        glDeleteShader( m_Shader );
}
///////////////////////////////////////////////////////////////////////////
// передача шейдера для компиляции
void cShader::source( const GLchar *shaderSource, GLint length ) const
{
    ASSERT( shaderSource );
    glShaderSource( m_Shader, 1, &shaderSource, &length );
}
///////////////////////////////////////////////////////////////////////////
// компиляция шейдера
GLint cShader::compile()
{
    glCompileShader( m_Shader );

    return checkStatus();
}
